#pragma once

#include <vector>
#include <cstdint>
#include <string>
#include <cstddef>
#include <flatbuffers/flatbuffers.h>

/**
 * @brief FlatBuffer序列化器
 * 封装Google FlatBuffers序列化功能
 */
class FlatBufferSerializer {
public:
    /**
     * @brief 序列化数据到FlatBuffer格式
     * @tparam DataType 数据类型 (如 UserData)
     * @tparam FBType FlatBuffer类型 (如 fb::User)
     * @param data 需要序列化的数据
     * @return 序列化后的数据
     */
    template<typename DataType>
    static std::vector<uint8_t> serialize(const DataType& data);

    /**
     * @brief 反序列化数据
     * @tparam DataType 数据类型 (如 UserData)
     * @tparam FBType FlatBuffer类型 (如 fb::User)
     * @param serialized_data 序列化后的数据
     * @param output_data 输出数据
     * @return 反序列化是否成功
     */
    template<typename DataType, typename FBType>
    static bool deserialize(const std::vector<uint8_t>& serialized_data, DataType& output_data);

    /**
     * @brief 获取序列化器类型名称
     * @return 序列化器类型名称
     */
    inline static std::string name() {
        return TYPE_NAME;
    }

    /**
     * @brief 获取序列化器版本
     * @return 序列化器版本
     */
    inline static std::string version() {
        return VERSION;
    }

private:
    static constexpr const char* TYPE_NAME = "flatbuffer";
    static constexpr const char* VERSION = "2.0.8";
};

namespace flatbuffers {
    template<typename FBType, typename DataType>
    flatbuffers::Offset<FBType> serialize(flatbuffers::FlatBufferBuilder& builder, const DataType& data);

    template<typename DataType, typename FBType>
    bool deserialize(DataType& output_data, const FBType* fb_obj);

    template<typename DataType, typename FBType>
    DataType from_flatbuffer(const FBType* fb_obj);
} // namespace flatbuffers